home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 1 / Meeting Pearls Vol 1 (1994).iso / installed_progs / gfx / pbm / source / netpbm-01mar94.patches.lha / pnm / pnmframe.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-20  |  3.2 KB  |  132 lines

  1. /* pnmpad.c - add border to sides of a portable anymap
  2.  ** (C) 1994 Rolf Mayer, Rolf.Mayer@rz.uni-karlsruhe.de
  3.  ** based on pnmpad (C) 1990 Angus Duggan (C) 1989 Jef Poskanzer
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "pnm.h"
  8.  
  9. int
  10. main(argc, argv)
  11.      int argc;
  12.      char *argv[];
  13. {
  14.    FILE *ifd;
  15.    xel *xelrow, *bgrow, background;
  16.    xelval maxval;
  17.    int rows, cols, newcols, row, col, format;
  18.    int left, right, top, bot, black, factor, framex, framey, minframe;
  19.    char *usage = "[-white|-black] [-l#] [-r#] [-t#] [-b#] [-d#] [-m#] [pnmfile]";
  20.  
  21.  
  22.    pnm_init( &argc, argv );
  23.  
  24.    black = 1;
  25.    left = right = top = bot = factor = framex = framey = minframe = 0;
  26.  
  27.    while (argc >= 2 && argv[1][0] == '-') {
  28.       if (strcmp(argv[1]+1,"black") == 0) black = 1;
  29.       else if (strcmp(argv[1]+1,"white") == 0) black = 0;
  30.       else switch (argv[1][1]) {
  31.       case 'l':
  32.      if ((left = atoi(argv[1]+2)) < 0)
  33.         pm_error("left border too small");
  34.      break;
  35.       case 'r':
  36.      if ((right = atoi(argv[1]+2)) < 0)
  37.         pm_error("right border too small");
  38.      break;
  39.       case 'b':
  40.      if ((bot = atoi(argv[1]+2)) < 0)
  41.         pm_error("bottom border too small");
  42.      break;
  43.       case 't':
  44.      if ((top = atoi(argv[1]+2)) < 0)
  45.         pm_error("top border too small");
  46.      break;
  47.       case 'd':
  48.      if ((factor= atoi(argv[1]+2)) < 1)
  49.         pm_error("denominator to small (must be > 1)");
  50.          break;
  51.       case 'm':
  52.      if ((minframe= atoi(argv[1]+2)) < 0)
  53.         pm_error("minimum frame to small");
  54.          break;
  55.       default:
  56.      pm_usage(usage);
  57.       }
  58.       argc--, argv++;
  59.    }
  60.  
  61.    if (argc > 2)
  62.       pm_usage(usage);
  63.    
  64.    if (argc == 2)
  65.       ifd = pm_openr(argv[1]);
  66.    else
  67.       ifd = stdin;
  68.  
  69.  
  70.  
  71.    pnm_readpnminit(ifd, &cols, &rows, &maxval, &format);
  72.    if (black)
  73.       background = pnm_blackxel(maxval, format);
  74.    else
  75.       background = pnm_whitexel(maxval, format);
  76.  
  77.    if (cols == 0 || rows == 0) {
  78.       pm_message("empty bitmap");
  79.       left = right = bot = top = 0;
  80.    }
  81.  
  82.    if (factor) {
  83.       pm_message("options -l -r -t -b ignored");
  84.       framex=cols/factor;
  85.       framey=cols/factor;
  86.       if (minframe) {
  87.          if (framex<=minframe && framey<=minframe) {
  88.         framex=minframe;
  89.         framey=minframe;
  90.         }
  91.      }
  92.       if (framex < framey)
  93.      framey=framex;
  94.       if (framey < framex)
  95.      framex=framey;
  96.       left = right = top = bot = framex;
  97.    }
  98.    if (minframe && factor==0) {
  99.       if (left<=minframe)
  100.      left = minframe;
  101.       if (right<=minframe)
  102.      right = minframe;
  103.       if (bot<=minframe)
  104.          bot= minframe;
  105.       if (top<=minframe)
  106.          top= minframe;
  107.       }
  108.    newcols = cols+left+right;
  109.    xelrow = pnm_allocrow(newcols);
  110.    bgrow = pnm_allocrow(newcols);
  111.  
  112.    for (col = 0; col < newcols; col++)
  113.       xelrow[col] = bgrow[col] = background;
  114.  
  115.    pnm_writepnminit(stdout, newcols, rows+top+bot, maxval, format, 0);
  116.  
  117.    for (row = 0; row < top; row++)
  118.       pnm_writepnmrow(stdout, bgrow, newcols, maxval, format, 0);
  119.  
  120.    for (row = 0; row < rows; row++) {
  121.       pnm_readpnmrow(ifd, xelrow+left, cols, maxval, format);
  122.       pnm_writepnmrow(stdout, xelrow, newcols, maxval, format, 0);
  123.    }
  124.  
  125.    for (row = 0; row < bot; row++)
  126.       pnm_writepnmrow(stdout, bgrow, newcols, maxval, format, 0);
  127.  
  128.    pm_close(ifd);
  129.  
  130.    exit(0);
  131. }
  132.